/**
 * Created by c.y on 2018-1-22
 * 文件说明: 产品添加与编辑公共方法
 */

/**
 * 创建单个元素
 * 元素类型-----1-文字,2-图片,3-文字和图片,4-标签
 * 属性类型  1-文字,2-图片,3-标签
 * @param { Array } attrValArray 该元素下的所有属性对应的属性值(必填)
 * @param { Number } elementType 元素的类型, 默认为文字元素（非必须）
 * @param { Number } attrNumber 该元素下的属性的个数，默认一个元素对应一个属性（非必须）
 * @param { Array } attrTypeArray 该元素下的所有属性对应的类型值，默认为一个文本属性类型的数组（非必须）
 * @return { Object } 单个元素
 */
function createElement (attrValArray, elementType = 1, attrNumber = 1, attrTypeArray = [1]) {
    let elemAtrrs = [];
    for (let i = 0; i < attrNumber; i++) {
        elemAtrrs.push({
            id: null,
            type: attrTypeArray[i],
            value: attrValArray[i]
        });
    }
    return {
        id: null,
        type: elementType,
        attrs: elemAtrrs
    };
}

/**
 * 获取产品列表的元素值
 * @param { Object } productInfo 产品配置数据
 * @return {Array}
 */
function getProdListElementVal (productInfo) {
    let elementVal = [];
    // 这个列表的label值
    elementVal.push(productInfo.prodImag);
    elementVal.push(productInfo.prodLabel);
    elementVal.push(productInfo.prodName);
    elementVal.push(productInfo.prodLimit);
    elementVal.push(productInfo.limitUnit);
    elementVal.push(productInfo.prodDesc);
    elementVal.push(productInfo.rateDesc);
    elementVal.push(productInfo.timeLimit);
    return elementVal;
}

/**
 * 创建产品列表信息的组件(此时这里顺序与元素的个数是固定的)
 * @param { Object } productInfo 产品配置数据
 * @return Array 元素列表
 */
function createProdListElement (productInfo) {
    let elementArrayVal = getProdListElementVal(productInfo);
    let listElement = [];
    for (let i = 0; i < 8; i++) {
        // 第一个元素是图片
        if (i === 0) {
            listElement.push(createElement([elementArrayVal[i]], 2, 1, [2]));
            // 第二个元素是标签(特殊标记)
        } else if (i === 1) {
            listElement.push(createElement([elementArrayVal[i]], 4, 1, [3]));
        } else {
            // 其他的都是单个元素
            listElement.push(createElement([elementArrayVal[i]]));
        }
    }
    return listElement;
}

/**
 * 编辑产品列表信息的组件(此时这里顺序与元素的个数是固定的)
 * @param { Object } initialProdInfo 产品初始化数据
 * @param { Object } updateProdInfo 产品编辑数据
 * @return Array 元素列表
 */
function updateProdListElement (initialProdInfo, updateProdInfo) {
    // 获取用户修改的数据
    let updateEleArrayVal = getProdListElementVal(updateProdInfo);
    // 获取组件初始化组件数组
    let initialProdList = initialProdInfo.prodListItemInfo.showEles;
    initialProdList.map(function (listItem, index) {
        listItem.attrs.forEach(function (item) {
            item.value = updateEleArrayVal[index];
        });
    });
    return initialProdList;
}

/**
 * 获取产品列表的头部元素值
 * @param { Object } productInfo 产品配置数据
 * @return {Array} 元素列表
 */
function getProdDetailHeadElementVal (productInfo) {
    let elementVal = [];
    // 这个列表的label值
    elementVal.push(productInfo.prodName);
    elementVal.push(productInfo.prodLimit);
    elementVal.push(productInfo.limitUnit);
    elementVal.push(productInfo.timeLimitDesc);
    elementVal.push(productInfo.timeLimitRange);
    elementVal.push(productInfo.approveDesc);
    elementVal.push(productInfo.approveTime);
    return elementVal;
}

/**
 * 创建产品详情信息的头部组件
 * @param productInfo
 * @return {Array} 元素列表
 */
function createProdDetailHeadElement (productInfo) {
    let elementArrayVal = getProdDetailHeadElementVal(productInfo);
    let listElement = [];
    for (let i = 0; i < 7; i++) {
        listElement.push(createElement([elementArrayVal[i]]));
    }
    return listElement;
}

/**
 * 更新产品详情信息的头部组件
 * @param { Object } initialProdInfo 产品初始化数据
 * @param { Object } updateProdInfo 产品配置数据
 * @return {Array} 元素列表
 */
function updateProdDetailHeadElement (initialProdInfo, updateProdInfo) {
    // 获取用户修改的数据
    let updateEleArrayVal = getProdDetailHeadElementVal(updateProdInfo);
    // 获取组件初始化组件数组
    let initialProdDetailHead = initialProdInfo.prodDetailInfo.components[0].showEles;
    initialProdDetailHead.map(function (listItem, index) {
        listItem.attrs.forEach(function (item) {
            item.value = updateEleArrayVal[index];
        });
    });
    return initialProdDetailHead;
}

/**
 * 创建产品详情的利率、申请条件、所需材料、自定义内容组件
 * @param {Array} arrayContent
 * @return Array 元素列表
 */
function createProdDetailContentElement (arrayContent) {
    let contentList = [];
    if (!(arrayContent instanceof Array)) {
        throw new Error('参数类型不是array');
    }
    arrayContent.forEach(function (item) {
        contentList.push(createElement([item]));
    });
    return contentList;
}

/**
 * 更新产品详情的申请条件、所需材料、自定义内容组件
 * @param { Object } initialProdInfo 产品初始化数据
 * @param { Number } contentIndex 组件的index
 * @param { Array } arrayContent 产品配置数据
 * @return {Array} 元素列表
 */
function updateProdDetailContentElement (initialProdInfo, contentIndex, arrayContent) {
    // 获取组件初始化组件数组
    let initialProdDetailContent = initialProdInfo.prodDetailInfo.components[contentIndex].showEles;
    let initialAttrLen = initialProdDetailContent.length;
    let addAttrLen = arrayContent.length;
    // 如果以前的内容大于新增的内容的话，那么那以前的多余内容删除掉，不传递给后台
    if (initialAttrLen > addAttrLen) {
        initialProdDetailContent.splice(addAttrLen, initialAttrLen - addAttrLen);
    }
    // 覆盖掉原来的默认值
    initialProdDetailContent.map(function (listItem, index) {
        listItem.attrs.forEach(function (item) {
            item.value = arrayContent[index];
        });
    });
    // 如果新增加的内容的条数大于以前的内容条数
    if (addAttrLen > initialAttrLen) {
        for (let i = initialAttrLen; i < addAttrLen; i++) {
            let addAttr = createElement([arrayContent[i]]);
            initialProdDetailContent.push(addAttr);
        }
    }
    return initialProdDetailContent;
}

export default {
    createElement,
    getProdListElementVal,
    createProdListElement,
    updateProdListElement,
    getProdDetailHeadElementVal,
    createProdDetailHeadElement,
    updateProdDetailHeadElement,
    createProdDetailContentElement,
    updateProdDetailContentElement
};
